#ifndef TCP_SERVER_FILEUTILS_H
#define TCP_SERVER_FILEUTILS_H

#include <sys/types.h>

#include "noncopyable.h"
#include "../net/Buffer.h"

namespace FileUtils {
    class ReadSmallFile : muduo::noncopyable {
    public:
        explicit ReadSmallFile(StringArg filename);

        ~ReadSmallFile();

        /**
         * 读取文件数据到String类型的content中, 返回值为errno
         */
        template<typename String>
        int readToString(int maxSize,
                         String *content,
                         int64_t *fileSize,
                         int64_t *modifyTime,
                         int64_t *createTime);

        /**
         * 读取最大长度为 kBufferSize 的文件数据到buf中
         * @param size 读取的文件长度
         * @return 返回err
         */
        int readToBuffer(int *size);

        /**
         * 获取buf指针
         */
        const char *buffer() const { return buf_; }

        static const int kBufferSize = 64 * 1024;

    private:
        int fd_;
        // 读取的文件描述符
        int err_;
        char buf_[kBufferSize];
    };

    /**
     * 读取文件数据到content中, 返回错误值
     */
    template<typename String>
    int readFile(StringArg filename,
                 int maxSize,
                 String *content,
                 int64_t *fileSize = nullptr,
                 int64_t *modifyTime = nullptr,
                 int64_t *createTime = nullptr) {
        ReadSmallFile file(filename);
        return file.readToString(maxSize, content, fileSize, modifyTime, createTime);
    }

// not thread safe
    class AppendFile : muduo::noncopyable {
    public:

        /**
         * 追加数据到文件中
         * @param filename
         */
        explicit AppendFile(StringArg filename);

        ~AppendFile();

        /**
         * 追加一行日志数据到文件中
         */
        void append(const char *logline, size_t len);

        /**
         * 清空缓冲区, 如果文件以写的方式打开, 会将缓冲区中的数据写入文件
         */
        void flush();


        off_t writtenBytes() const { return writtenBytes_; }

    private:

        size_t write(const char *logline, size_t len);

        FILE *fp_;
        char buffer_[64 * 1024];
        off_t writtenBytes_;
        // 已经写入的数据数量
    };

}


#endif //TCP_SERVER_FILEUTILS_H
